home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / comm / tcp / dyn1_0_3.lha / dyn.c < prev    next >
C/C++ Source or Header  |  1997-04-27  |  5KB  |  178 lines

  1. /* 
  2.    DYN -- a simple DYNdns client for the Monolith Coalition
  3.  
  4.    Written by Jon Klippenstein <random@ocii.com>
  5.    Copyright (C) 1997 Jon Klippenstein
  6.  
  7.    Network code based in part on fetchwww.c 1.0 by Artur Skawina 
  8.    <skawina@usa.net>
  9.  
  10.    The dyn.ml.org domain is hardcoded in, this will have to be changed if 
  11.    the dynamic domain changes.
  12.  
  13.    OS'es tested on:
  14.    Linux 2.0.27 i386 (my machine, a pitiful 386DX/40 :( )
  15.    SunOS 5.5 sparc (my ISP's machine)
  16.  
  17.    Version: 1.0
  18.  
  19.    $Header: /root/Projects/dyn-1.0alpha/RCS/dyn.c,v 1.4 1997/02/01 20:36:46 root Exp $
  20.  
  21.    $Log: dyn.c,v $
  22.    Revision 1.4  1997/02/01 20:36:46  root
  23.    added sysname,machine check with uname
  24.    added syslog stuff
  25.    added sleep 5 bit to readme
  26.  
  27.    Revision 1.3  1997/01/31 23:52:42  root
  28.    Added major funtionality
  29.    Added usage message
  30.    Added magic token checking
  31.    Added whole pile 'o crap :)
  32.  
  33.    Revision 1.2  1997/01/31 03:36:24  root
  34.    Made it work right.
  35.    Using some of the network code from Artur Skawina's fetchwww.c
  36.  
  37.    Revision 1.1  1997/01/31 01:10:50  root
  38.    Initial revision
  39.  
  40.  */
  41.  
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <strings.h>
  45. #include <sys/types.h>
  46. #include <sys/socket.h>
  47. #include <errno.h>
  48. #include <unistd.h>
  49. #include <netinet/in.h>
  50. #include <netdb.h>
  51. #include <arpa/inet.h>
  52. #include <sys/utsname.h>    /* for uname functions */
  53. #include <syslog.h>
  54.  
  55. #define VERSION        "1.0.3/13.bugfix"
  56.  
  57. /* Uncomment DEBUG if you want to see raw HTML output from the server 
  58.    (not neccessary unless you REALLY know what you are doing :)) */
  59. /* #define      DEBUG */
  60.  
  61. /* These are just in here so I can change them easily if the server or 
  62.    path the freed.cgi changes (or if the WWW port number changes!! :)) */
  63. #define WWW_PORT    80
  64. #define SERVER        "scripts.ml.org"
  65. #define SCRIPT      "/mis-bin/freed.cgi"
  66.  
  67. int strtcmp(char *str1, char *str2)
  68. {
  69.   return (strncmp(str1, str2, strlen(str2)));
  70. }
  71.  
  72. int main(int argc, void *argv[])
  73. {
  74.   struct sockaddr_in sin;
  75.   struct hostent *host;
  76.   int sock, port, connected;
  77.   char send[1024];
  78.   char temp[1024];
  79.   int i;
  80.   FILE *rfile;
  81.   struct utsname uts;
  82.  
  83.   printf("DYN %s by Jon Klippenstein <random@ocii.com>\n\n", VERSION);
  84. #ifdef DEBUG
  85.   printf("*** DEBUG MODE ***\n");
  86. #endif
  87.   openlog(argv[0], LOG_PID, LOG_USER);
  88.  
  89.   if (argc != 7) {
  90.     printf("\nusage: %s MID SEC1 SEC2 SEC3 IP MACHINE\n", argv[0]);
  91.     printf("\tMID\tyour Monolith Coalition ID\n");
  92.     printf("\tSEC1\tthe first number in your security code\n");
  93.     printf("\tSEC2\tthe second number in your security code\n");
  94.     printf("\tSEC3\tthe third number in your security code\n");
  95.     printf("\tIP\tyour machine CURRENT dynamic IP.\n");
  96.     printf("\tMACHINE\tyour dynamic dns name, such as xpl.\n\n");
  97.     printf("Example: %s klip1 11 22 33 123.123.123.123 xpl\n\n", argv[0]);
  98.     exit(1);
  99.   }
  100.   uname(&uts);
  101.  
  102.   printf("Host:\t%s.dyn.ml.org\n", argv[6]);
  103.   printf("IP:\t%s\n", argv[5]);
  104.   printf("MID:\t%s\n", argv[1]);
  105.   printf("MACTYP:\t%s\n", uts.machine);
  106.   printf("OS:\t%s\n", uts.sysname);
  107.  
  108.   sin.sin_family = AF_INET;
  109.   sin.sin_port = htons(80);
  110.  
  111.   if (!(host = gethostbyname(SERVER))) {
  112.     syslog(LOG_WARNING, "gethostbyname: %m");
  113.     perror("gethostbyname");
  114.     exit(1);
  115.   }
  116.   memcpy((char *) &sin.sin_addr, host->h_addr, host->h_length);
  117.  
  118.   printf("\nConnecting to %s...", SERVER);
  119.  
  120.   if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  121.     syslog(LOG_WARNING, "socket: %m");
  122.     perror("socket");
  123.     exit(1);
  124.   }
  125.   if (connect(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
  126.     syslog(LOG_WARNING, "connect: %m");
  127.     perror("connect:");
  128.     exit(1);
  129.   }
  130.   printf("connnected.\n");
  131.  
  132.   /* Now create line to send to HTTP server */
  133.  
  134.   printf("Sending update...");
  135.  
  136.   sprintf(send, "GET %s?do=mod&type=machine&domain=%s&db=DYN.ML.ORG&ipaddr=%s&mactype=%s&os=%s&WWW=yes&mail=&MID=%s&sec1=%s&sec2=%s&sec3=%s&agree=agree\n", SCRIPT, argv[6], argv[5], uts.machine, uts.sysname, argv[1], argv[2], argv[3], argv[4]);
  137.  
  138.   write(sock, send, strlen(send));
  139.  
  140.   printf("done.\n");
  141.  
  142.   printf("Waiting for reply...");
  143.  
  144.   rfile = fdopen(sock, "r");
  145.  
  146.   while (!feof(rfile)) {
  147.     fgets(&temp, sizeof(temp), rfile);
  148.  
  149. #ifdef DEBUG
  150.   printf("%s", temp);
  151. #endif
  152.  
  153. /* Check for the ml-host-added magic token as explained by Aveek Datta:
  154.  
  155.    MTTS has been updated to remove the "DYNDNS isn ot available yet".  And as
  156.    someone asked, there is now a magic token in the return that you can test
  157.    for:
  158.  
  159.    <!-- ML-HOST-ADDED -->
  160.  
  161.    is present if the host was added/modified OK
  162.  */
  163.  
  164.     if (strtcmp(temp, "<!-- ML-HOST-ADDED -->") == 0) {
  165.       printf("\n\n%s [%s] was updated successfully.\n", argv[6], argv[5]);
  166.       syslog(LOG_INFO, "%s [%s] update successful.", argv[6], argv[5]);
  167.       fclose(rfile);
  168.       close(sock);
  169.       exit(0);
  170.     }
  171.   }
  172.  
  173.   printf("\nERROR: ML-HOST-ADDED magic token not found in reply.\nHost NOT updated.\n");
  174.   syslog(LOG_ERR, "ERROR: ML-HOST-ADDED not found, update unsuccessful.");
  175.   fclose(rfile);
  176.   close(sock);
  177. }
  178.